package day15.FileAndIodemo.FileinputStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

//从文件中读取数据到内存
//输入流，把东西通过什么渠道输入到内存中

//is.read()这个方法返回的是读单个字节并返回其码点（asc），读到文件末尾返回-1
//is.read(byte[] b)传入一个字节数组（填充），返回实际读取的字节数，读到文件末尾返回-1

public class demo1
{
    public static void main(String[] args) throws Exception {
        InputStream is =new FileInputStream("src/day15/FileAndIodemo/测试.txt");

        //read方法是读取并往后移位最好接一下，别一直调用
        int a;    //这是单个字节单个字节去收集文本的信息，太慢,不常用。而且中文字符是三个字节表示一个字，他这样一个字节
                 // 去解读，一定会乱码
//        while((a=is.read())!=-1)
//        {
//            System.out.print((char)a);
//        }

//        byte []bytes=new byte[1024];
////        System.out.println(is.read());//输出-1
//
//        while(is.read(bytes)!=-1)
//        {
//            System.out.print(new String(bytes));//只填充了字节数组的前几个空间，所以输出会有很多空格
//        }
      //  byte []bytes=new byte[3];
//        System.out.println(is.read());//输出-1

//        //无法解决中文字符乱码问题，因为这是固定字节长度去读取，三个三个读，万一有一个落单的一个字节的字符和中文字符前两个组合一起就乱码
//        int len;
//        while((len=is.read(bytes))!=-1)//把当前读取的实际字符数返回
//        {
//           // System.out.print(new String(bytes));//只填充了字节数组的前几个空间，所以输出会有很多空格
//            System.out.print(new String(bytes,0,len));//解决后面很多空格：每次bytes数组会被更新，从0开始，只输出读取到的实际长度就行了
//        }
//        System.out.println();
//        System.out.print("***************");



        //解决中文字符问题，但仅限于****小文件*****，100GB的文件，我的byte数组也应该要那么大，但是不可能
        byte[] bytes2=is.readAllBytes();//这就是字节类型的数组相互赋值而已,
                                         //这个还是通过read方法里面的指针，
                                        //  前面那些已经把指针指到文件末尾了，is.read里面的指针，要给他关了重新来个输入流
        String rs=new String(bytes2);
        System.out.println(rs);//返回一个填充好的byte数组，非常完美那种




        is.close();
    }
}
